import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import defaultSettings from '@/settings'

// 创建axios实例
const service = axios.create({
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: defaultSettings.timeout || 10000 // 请求超时时间（默认10秒）
})

// 请求拦截器
service.interceptors.request.use(
    config => {
        // 调试输出请求信息
        console.log('发送请求:', {
            url: config.url,
            baseURL: config.baseURL,
            fullURL: config.baseURL + config.url,
            method: config.method,
            headers: config.headers,
            data: config.data,
            params: config.params
        })

        // 设置默认Content-Type
        if (config.method.toLowerCase() === 'post' || config.method.toLowerCase() === 'put') {
            config.headers['Content-Type'] = config.headers['Content-Type'] || 'application/json';
        }

        // 在发送请求之前处理
        if (store.getters.token) {
            // 根据后端需要的格式设置token
            // 添加Bearer前缀，符合JWT标准
            config.headers['Authorization'] = 'Bearer ' + getToken()
        }
        return config
    },
    error => {
        // 处理请求错误
        console.error('请求拦截器错误:', error) // 用于调试
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    response => {
        // 调试信息
        console.log('API响应:', {
            url: response.config.url,
            method: response.config.method,
            status: response.status,
            data: response.data
        })

        const res = response.data

        // 根据后端实际响应格式调整条件
        // 这里假设后端成功响应的code可能是0、200或20000
        if (res.code !== 0 && res.code !== 200 && res.code !== 20000) {
            Message({
                message: res.message || res.msg || '系统错误',
                type: 'error',
                duration: 5 * 1000
            })

            // token相关错误码处理
            if (res.code === 401 || res.code === 50008 || res.code === 50012 || res.code === 50014) {
                // 重新登录
                MessageBox.confirm('您已登出或登录已过期，请重新登录', '确认登出', {
                    confirmButtonText: '重新登录',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => {
                    store.dispatch('user/resetToken').then(() => {
                        location.reload()
                    })
                })
            }
            return Promise.reject(new Error(res.message || res.msg || '系统错误'))
        } else {
            return res
        }
    },
    error => {
        // 调试错误信息
        console.error('API错误:', {
            url: error.config ? error.config.url : '未知',
            method: error.config ? error.config.method : '未知',
            error: error.message,
            response: error.response ? {
                status: error.response.status,
                data: error.response.data
            } : '无响应'
        })

        let message = error.message || '请求错误'

        if (error.response) {
            switch (error.response.status) {
                case 401:
                    message = '未授权，请重新登录'
                    store.dispatch('user/resetToken').then(() => {
                        location.reload()
                    })
                    break
                case 403:
                    message = '拒绝访问'
                    break
                case 404:
                    message = '请求错误，未找到该资源'
                    break
                case 500:
                    message = '服务器错误'
                    break
                default:
                    message = `连接错误${error.response.status}`
            }
        } else if (error.message.includes('timeout')) {
            message = '请求超时'
        }

        Message({
            message: message,
            type: 'error',
            duration: 5 * 1000
        })

        return Promise.reject(error)
    }
)

export default service